//package driver;
//
//import java.io.File;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//import models.action.Action;
//import models.asl.Graph;
//import models.asl.Node;
//import models.state.EnvStateGraph;
//
//import org.eclipse.core.resources.IProject;
//import org.eclipse.core.resources.IWorkspaceRoot;
//import org.eclipse.core.resources.ResourcesPlugin;
//import org.eclipse.core.runtime.CoreException;
//
//import check.Checker;
//import reader.ActionReader;
//import reader.Transformation;
//import reader.UMLReader;
//import redesign.Redesign;
//import writer.ASLFileWriter;
//import gui.ActPreAndPostCondWindow;
//import gui.ConfirmWindow;
//import gui.SpecifyProjectAndASLFileWindow;
//
//// TODO: Auto-generated Javadoc
///**
// * The Class MainDriver.
// */
//public class MainDriver {
//
//    /** The project name. */
//    private String projectName;
//
//    /** The asl file name. */
//    public static String aslFileName;
//
//    /** The project location. */
//    public static String projectLocation;
//
//    /** The state tran diagram name. */
//    public static String stateTranDiagramName;
//
//    /** File list. */
//    private static List<String> fileLists;
//
//    /** The act pre and post cond window. */
//    private ActPreAndPostCondWindow actPreAndPostCondWindow;
//
//    /** The asl file path. */
//    public static String aslFilePath = null;
//
//    /** The Constant RESULT_FILE_PATH. */
//    private static final String RESULT_FILE_PATH = "test_file//";
//
//    /**
//     * Instantiates a new main driver.
//     * 
//     * @param projectName
//     *            the project name
//     * @param aslFileName
//     *            the asl file name
//     * @param stateTranDiagramName
//     *            the state tran diagram name
//     */
//    public MainDriver(String projectName, String aslFileName,
//            String stateTranDiagramName) {
//        this.projectName = projectName;
//        MainDriver.aslFileName = aslFileName;
//        MainDriver.stateTranDiagramName = stateTranDiagramName;
//        fileLists = new ArrayList<String>();
//        actPreAndPostCondWindow = new ActPreAndPostCondWindow();
//    }
//
//    /**
//     * Run.
//     */
//    public void run() {
//        projectLocation = findAllTypeFiles("asl;uml");
//        System.out.println("Project Path:" + projectLocation);
//        aslFilePath = null;
//        for (String aslFile : fileLists) {
//            String aslFileNameFromPath = aslFile.substring(aslFile
//                    .lastIndexOf("\\") + 1);
//            if (aslFileNameFromPath != null
//                    && aslFileNameFromPath
//                            .equalsIgnoreCase(MainDriver.aslFileName)) {
//                aslFilePath = aslFile;
//                break;
//            }
//        }
//        Transformation transformation = new Transformation(aslFilePath);
//        List<Graph> graphs;
//        // check to see if there is previous cached actions pre & post conditions
//        List<Action> preActions = null;
//        try {
//            ActionReader ar = new ActionReader();
//            preActions = ar.readActions(projectLocation + File.separator
//                    + "temp" + File.separator + aslFileName + ".action");
//        } catch (Exception e1) {
//            // TODO Auto-generated catch block
//            e1.printStackTrace();
//        }
//        // try to find previous saved pre and post conditions
//
//        try {
//            graphs = transformation.generate();
//            // for (Graph g : graphs) {
//            List<String> actions = graphs.get(0).getAgentActions();
//            for (String action : actions) {
//                String r[] = new String[] { action, "", "" };
//                if (preActions != null && !preActions.isEmpty()) {
//                    for (Action preAction : preActions) {
//                        if (preAction.getName().equalsIgnoreCase(action)) {
//                            r[1] = parseConditions(preAction.getPreCondition());
//                            r[2] = parseConditions(preAction.getPostCondition());
//                        }
//                    }
//                }
//
//                actPreAndPostCondWindow.getDefaultTableModel().addRow(r);
//            }
//            // }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        actPreAndPostCondWindow.setVisible(true);
//
//    }
//
//    /**
//     * Parses the conditions.
//     * 
//     * @param conditions
//     *            the conditions
//     * @return the string
//     */
//    private String parseConditions(List<String> conditions) {
//        String condString = "";
//        if (conditions != null) {
//            int count = 0;
//            for (String condition : conditions) {
//                if (count++ != 0) {
//                    condString += ";";
//                }
//                condString += condition;
//            }
//        }
//        return condString;
//    }
//
//    // find All asl files
//    /**
//     * Find all type files.
//     * 
//     * @param filePostFix
//     *            the file post fix
//     * @return the string
//     */
//    private String findAllTypeFiles(String filePostFix) {
//        projectLocation = getProjectPath();
//        if (projectLocation == null) {
//            return null;
//        }
//        refreshFileList(projectLocation, filePostFix);
//        return projectLocation;
//
//    }
//
//    /**
//     * get all asl files.
//     * 
//     * @param strPath
//     *            the str path
//     * @param filePostFix
//     *            the file post fix
//     */
//    private void refreshFileList(String strPath, String filePostFix) {
//        File dir = new File(strPath);
//        File[] files = dir.listFiles();
//        String[] postFixs = filePostFix.trim().split(";");
//        if (files == null)
//            return;
//        for (int i = 0; i < files.length; i++) {
//            if (files[i].isDirectory()) {
//                refreshFileList(files[i].getAbsolutePath(), filePostFix);
//            } else {
//                // String strFileName = files[i].getAbsolutePath().toLowerCase();
//                String filePath = files[i].getPath();
//                for(String postFix : postFixs) {
//                    if (filePath.toLowerCase().endsWith('.' + postFix.toLowerCase())
//                            && !filePath.contains('\\' + "bin" + '\\')) {
//                        fileLists.add(files[i].getAbsolutePath());
//                    }
//                }
//            }
//        }
//    }
//
//    /**
//     * project path.
//     * 
//     * @return project path
//     */
//    private String getProjectPath() {
//        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
//        IProject project = workspaceRoot.getProject(this.projectName);
//        if (!project.exists()) {
//            java.awt.EventQueue.invokeLater(new Runnable() {
//                public void run() {
//                    new SpecifyProjectAndASLFileWindow("MAS project: "
//                            + projectName + " does not exist.")
//                            .setVisible(true);
//                }
//            });
//            return null;
//        }
//
//        if (!project.isOpen()) {
//            try {
//                project.open(null);
//            } catch (CoreException e) {
//                e.printStackTrace();
//            }
//        }
//
//        String locationString = project.getLocation().toString();
//        return locationString;
//    }
//
//    /**
//     * Gets the project name.
//     * 
//     * @return the projectName
//     */
//    public String getProjectName() {
//        return projectName;
//    }
//
//    /**
//     * Sets the project name.
//     * 
//     * @param projectName
//     *            the projectName to set
//     */
//    public void setProjectName(String projectName) {
//        this.projectName = projectName;
//    }
//
//    /**
//     * Gets the asl file name.
//     * 
//     * @return the aslFileName
//     */
//    public String getAslFileName() {
//        return aslFileName;
//    }
//
//    /**
//     * Sets the asl file name.
//     * 
//     * @param aslFileName
//     *            the aslFileName to set
//     */
//    public void setAslFileName(String aslFileName) {
//        MainDriver.aslFileName = aslFileName;
//    }
//
//    /**
//     * Gets the state tran diagram name.
//     * 
//     * @return the stateTranDiagramName
//     */
//    public String getStateTranDiagramName() {
//        return stateTranDiagramName;
//    }
//
//    /**
//     * Sets the state tran diagram name.
//     * 
//     * @param stateTranDiagramName
//     *            the stateTranDiagramName to set
//     */
//    public void setStateTranDiagramName(String stateTranDiagramName) {
//        MainDriver.stateTranDiagramName = stateTranDiagramName;
//    }
//
//    /**
//     * Generate suggestion.
//     */
//    public static void generateSuggestion() {
//        try {
//
//            UMLReader umlReader = new UMLReader();
//
//            String umlFilePath = null;
//            for (String aslFile : fileLists) {
//                String aslFileNameFromPath = aslFile.substring(aslFile
//                        .lastIndexOf("\\") + 1);
//                if (aslFileNameFromPath != null
//                        && aslFileNameFromPath
//                                .equalsIgnoreCase(MainDriver.stateTranDiagramName)) {
//                    umlFilePath = aslFile;
//                    break;
//                }
//            }
//            EnvStateGraph graph = umlReader.parseUMLFile(umlFilePath);
//            //
//            // for(String aslFile : fileLists) {
//            // String aslFileNameFromPath = aslFile.substring(aslFile.lastIndexOf("\\") + 1);
//            // if(aslFileNameFromPath != null && aslFileNameFromPath.equalsIgnoreCase(MainDriver.aslFileName)) {
//            // aslFilePath = aslFile;
//            // break;
//            // }
//            // }
//
//            // read pre&post condition of actions
//            ActionReader ar = new ActionReader();
//            List<Action> actions;
//
//            actions = ar.readActions(projectLocation + File.separator + "temp"
//                    + File.separator + aslFileName + ".action");
//
//            Transformation transformation = new Transformation(aslFilePath);
//            List<Graph> domainGraph;
//            domainGraph = transformation.generate();
//            Map<Node, List<String>> requireCheck = null;
//            do {
//                requireCheck = Checker
//                        .checkContextConditionRequired(graph,
//                                domainGraph.get(0), actions);
//                System.out.println(requireCheck);
//                Redesign.redesignGraph(domainGraph.get(0), requireCheck);
//                System.out.println("After Redesign:" + domainGraph.get(0));
//            } while(requireCheck != null && !requireCheck.isEmpty());
//            ConfirmWindow cw = new ConfirmWindow();
//            ASLFileWriter.writeToConfirmWindow(cw, domainGraph.get(0));
//            cw.setVisible(true);
////            ASLFileWriter.writeASLFile(projectLocation + File.separator + "src"+ File.separator + "redesign_"
////                    + MainDriver.aslFileName, domainGraph.get(0));
//        } catch (Exception e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
//    }
//
//}
